package com.stark.wechat.service.message.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 模板消息
 *
 * @author <a href="mailto:mengbin@hotmail.com">Ben</a>
 * @version 1.0.0
 * @see <a href="https://developers.weixin.qq.com/doc/service/api/notify/template/api_sendtemplatemessage.html#%E8%AF%B7%E6%B1%82%E4%BD%93-Request-Payload">基础消息与订阅通知 / 模板消息 / 发送模板消息</a>
 * @since 2024/5/27
 */
@Data
@Accessors(chain = true)
public class TemplateMessage implements Serializable {

    private static final long serialVersionUID = -3269142787503705257L;

    /**
     * 接收者（用户）的 openid
     */
    private String touser;

    /**
     * 所需下发的订阅模板id
     */
    @JsonProperty("template_id")
    private String templateId;

    /**
     * 模板跳转链接（海外账号没有跳转能力,url 和 miniprogram 同时不填，无跳转，url 和 miniprogram 同时填写，优先跳转小程序）
     */
    private String url;

    /**
     * 跳转小程序时填写（url 和 miniprogram 同时不填，无跳转，page 和 miniprogram 同时填写，优先跳转小程序）
     */
    private Miniprogram miniprogram;

    /**
     * 模板内容，需根据模板给定的格式给出（参考注意事项），格式形如 { "key1": { "value": any }, "key2": { "value": any } }
     */
    private Map<String, Keyword> data = new LinkedHashMap<>();

    /**
     * 防重入id。对于同一个openid + client_msg_id, 只发送一条消息,10分钟有效,超过10分钟不保证效果。若无防重入需求，可不填
     */
    @JsonProperty("client_msg_id")
    private String clientMsgId;

    /**
     * 添加模板内容
     *
     * @param key   键
     * @param value 值
     * @return 当前对象
     */
    public TemplateMessage addData(String key, String value) {
        this.data.put(key, new Keyword(value));
        return this;
    }

    /**
     * 小程序
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Accessors(chain = true)
    public static class Miniprogram implements Serializable {

        private static final long serialVersionUID = 9040529593797319085L;

        /**
         * 小程序appid
         */
        private String appid;

        /**
         * 小程序跳转路径
         */
        private String pagepath;

    }

    /**
     * 关键字
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Keyword implements Serializable {

        private static final long serialVersionUID = -6768926248141660793L;

        /**
         * 值
         */
        private String value;

    }

}
